home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / rskey / source / rskey.asm < prev   
Encoding:
Assembly Source File  |  1991-10-19  |  7.6 KB  |  463 lines

  1.         .286
  2. _TEXT        SEGMENT  DWORD PUBLIC 'CODE'
  3. _TEXT        ENDS
  4. _DATA        SEGMENT  WORD PUBLIC 'DATA'
  5. _DATA        ENDS
  6. CONST        SEGMENT  WORD PUBLIC 'CONST'
  7. CONST        ENDS
  8. _BSS        SEGMENT  WORD PUBLIC 'BSS'
  9. _BSS        ENDS
  10. _INST        SEGMENT  DWORD PUBLIC 'INST'
  11. _INST        ENDS
  12. DGROUP        GROUP     _TEXT, CONST,    _BSS,    _DATA,    _INST
  13.  
  14.         ASSUME  CS: DGROUP, DS: DGROUP
  15.  
  16. regs_set    struc
  17. regs_es        dw    ?
  18. regs_ds        dw    ?
  19. regs_di        dw    ?
  20. regs_si        dw    ?
  21. regs_bp        dw    ?
  22. regs_sp        dw    ?
  23. regs_bx        dw    ?
  24. regs_dx        dw    ?
  25. regs_cx        dw    ?
  26. regs_ax        dw    ?
  27. regs_ip        dw    ?
  28. regs_cs        dw    ?
  29. regs_cf        dw    ?
  30. regs_set    ends
  31.  
  32. _TEXT        segment
  33.  
  34. CHK_BYTE    equ    4
  35.  
  36.         org    02ch
  37. EnvSeg        label    word
  38.  
  39.         org    080h
  40. CmdsLine    label    byte
  41.  
  42.         org    100h
  43. entry:        jmp    main
  44.  
  45. Chk_Str        db    'TERM'
  46.  
  47. term_flg    db    0
  48. term_port    db    0
  49. rts_flg        db    0
  50. key_shift    db    ?
  51.  
  52. key_code    dw    0FFFFh
  53. key_addr    dw    0
  54.  
  55. key_vect    dd    far
  56.  
  57. RS_status    dw    ?
  58. RS_old_param    db    18 dup (?)
  59.  
  60. RS_param    db    ?,?
  61. RS_buf_off    dw    ?
  62. RS_buf_seg    dw    ?
  63.         dw    ?,?
  64. RS_irq_off    dw    ?
  65. RS_irq_seg    dw    ?
  66.         db    ?,?,?
  67.  
  68. RS_buffer    dw    1024+4+8 dup (?)
  69.  
  70. ;            +0    +1    +2    +3    +4    +5    +6    +7
  71. ;            +8    +9    +a    +b    +c    +d    +e    +f
  72. enc_key_tbl    dw    1B10h,1E10h,2E10h,2C10h,2010h,1310h,2110h,2210h    ;+00 ^@
  73.         dw    0F00h,1000h,2410h,4E00h,2610h,1D00h,2F10h,1910h ;+08 ^H
  74.         dw    1A10h,1110h,1410h,1F10h,1510h,1710h,2D10h,1210h    ;+10 ^P
  75.         dw    2B10h,1610h,2A10h,0100h,5100h,4F00h,4D00h,5000h ;+18 ^X
  76.         dw    3500h,0204h,0304h,0404h,0504h,0604h,0704h,0804h    ;+20 
  77.         dw    0904h,0A04h,2804h,2704h,3100h,0C00h,3200h,3300h ;+28 (
  78.         dw    0B00h,0200h,0300h,0400h,0500h,0600h,0700h,0800h    ;+3x 0
  79.         dw    0900h,0A00h,2800h,2700h,3104h,0C04h,3204h,3304h ;+38 8
  80.         dw    1B00h,1E04h,2E04h,2C04h,2004h,1304h,2104h,2204h    ;+40 @
  81.         dw    2304h,1804h,2404h,2504h,2604h,3004h,2F04h,1904h ;+48 H
  82.         dw    1A04h,1104h,1404h,1F04h,1504h,1704h,2D04h,1204h    ;+50 P
  83.         dw    2B04h,1604h,2A04h,1C00h,0E00h,2900h,0D00h,3400h ;+58 X
  84.         dw    1B04h,1E00h,2E00h,2C00h,2000h,1300h,2100h,2200h    ;+60 `
  85.         dw    2300h,1800h,2400h,2500h,2600h,3000h,2F00h,1900h ;+68 h
  86.         dw    1A00h,1100h,1400h,1F00h,1500h,1700h,2D00h,1200h    ;+70 p
  87.         dw    2B00h,1600h,2A00h,1C04h,0E04h,2904h,0D04h,4B00h ;+78 x
  88.  
  89. Term_Ent    proc    near
  90.  
  91.         cmp    word ptr [key_code],0FFFFh
  92.         je    key_in_loop
  93.  
  94.         mov    ah,0
  95.         mov    dx,[key_code]
  96.         mov    bx,[key_addr]
  97.         mov    word ptr [key_code],0FFFFh
  98.         jmp    key_out_ret
  99.  
  100. key_in_loop:    mov    ax,0901h
  101.         pushf
  102.         call    cs:[key_vect]
  103.         mov    [key_shift],bl
  104.  
  105.         cmp    bh,69h
  106.         jne    term_chk
  107.  
  108. key_cnt_chk:    mov    ah,07h
  109.         pushf
  110.         call    cs:[key_vect]
  111.         cmp    bh,69h
  112.         jne    term_on_off
  113.         mov    ax,0900h
  114.         pushf
  115.         call    cs:[key_vect]
  116.         jmp    key_cnt_chk
  117.  
  118. term_on_off:    mov    al,[term_flg]
  119.         xor    al,1
  120.         mov    [term_flg],al
  121.         jmp    key_in_loop
  122.  
  123. term_chk:    cmp    byte ptr [term_flg],0
  124.         jne    term_chk_2
  125.  
  126.         cmp    dh,0FFh
  127.         jne    key_out_ret
  128.  
  129.         jmp    end_of_chk
  130.  
  131. term_chk_2:    cmp    dh,0FFh
  132.         je    not_key
  133.  
  134.         cmp    bh,5Ah
  135.         jbe    rs_out
  136.  
  137. key_out_ret:    mov    byte ptr [bp+regs_ax+1],ah
  138.         mov    [bp+regs_bx],bx
  139.         mov    [bp+regs_dx],dx
  140.         ret
  141.  
  142. rs_out:        mov    ah,07h
  143.         mov    al,[term_port]
  144.         int    9Bh
  145.         jmp    key_in_loop
  146.  
  147. not_key:    mov    ah,05h
  148.         mov    al,[term_port]
  149.         int    9Bh
  150.         cmp    ah,0
  151.         jne    end_of_chk
  152.  
  153.         cmp    [rts_flg],0
  154.         je    rs_chk_1
  155.  
  156.         cmp    dx,256
  157.         jnb    rs_chk_1
  158.  
  159.         mov    byte ptr [rts_flg],0
  160.         push    ax
  161.         push    dx
  162.         mov    ah,08h
  163.         mov    al,[term_port]
  164.         mov    dl,22h
  165.         int    9Bh
  166.         pop    dx
  167.         pop    ax
  168.  
  169. rs_chk_1:    cmp    dx,0
  170.         je    end_of_chk
  171.  
  172.         mov    ah,06h
  173.         mov    al,[term_port]
  174.         int    9Bh
  175.         cmp    ah,0
  176.         jne    end_of_chk
  177.  
  178.         cmp    dl,0Ah            ; Not Ret 0Ah Key Code
  179.         je    not_key
  180.  
  181.         sub    bh,bh
  182.         mov    bl,[key_shift]
  183.  
  184.         sub    dh,dh
  185.         cmp    dl,80h
  186.         jnb    not_enc_key
  187.  
  188.         mov    bx,dx
  189.         add    bx,dx
  190.         add    bx,offset DGROUP:enc_key_tbl
  191.         mov    bx,[bx]
  192.  
  193. not_enc_key:    mov    ah,0
  194.         jmp    key_out_ret
  195.  
  196. end_of_chk:    cmp    byte ptr [bp+regs_ax],0
  197.         jne    end_of_nul
  198.         jmp    key_in_loop
  199.  
  200. end_of_nul:    mov    ah,0
  201.         mov    bh,0FFh
  202.         mov    bl,[key_shift]
  203.         mov    dx,0FFFFh
  204.         jmp    key_out_ret
  205.  
  206. Term_Ent    endp
  207.  
  208. Key_Bios    proc    near
  209.         cmp    ah,09h
  210.         je    term_key
  211.         cmp    ah,07h
  212.         je    term_key
  213.         jmp    cs:[key_vect]
  214.  
  215. term_key:    pusha
  216.         push    ds
  217.         push    es
  218.         mov    bp,sp
  219.  
  220.         sti
  221.         push    cs
  222.         pop    ds
  223.  
  224.         cmp    ah,09
  225.         je    term_key_1
  226.  
  227.         mov    byte ptr [bp+regs_ax],1
  228.         call    Term_Ent
  229.         mov    [key_code],dx
  230.         mov    [key_addr],bx
  231.         cmp    dh,0FFh
  232.         jne    term_key_2
  233.         mov    byte ptr [bp+regs_ax],0
  234.         jmp    term_key_2
  235.  
  236. term_key_1:    call    Term_Ent
  237.  
  238. term_key_2:    pop    es
  239.         pop    ds
  240.         popa
  241.         iret
  242.  
  243. Key_Bios    endp
  244.  
  245. RS_irq_ent    proc    far
  246.         cmp    ah,10h
  247.         jne    RS_irq_1
  248.         mov    ah,08h
  249.         mov    al,cs:[term_port]
  250.         mov    dl,02h
  251.         int    9Bh
  252.         mov    byte ptr cs:[rts_flg],1
  253. RS_irq_1:    ret
  254. RS_irq_ent    endp
  255.  
  256. _TEXT        ends
  257.  
  258. _INST        segment
  259.         ASSUME CS: DGROUP, DS: DGROUP
  260.  
  261. Start_init    label    word
  262.  
  263. RS_init        proc    near
  264.         mov    ah,09h
  265.         mov    al,[term_port]
  266.         int    9Bh
  267.         mov    [RS_status],dx
  268.  
  269.         mov    ah,02h
  270.         mov    al,[term_port]
  271.         int    9Bh
  272.  
  273.         mov    ah,04h
  274.         mov    al,[term_port]
  275.         mov    di,offset DGROUP:RS_old_param
  276.         int    9Bh
  277.  
  278.         mov    ah,04h
  279.         mov    al,[term_port]
  280.         mov    di,offset DGROUP:RS_param
  281.         int    9Bh
  282.  
  283.         mov    bx,offset DGROUP:RS_buffer+15
  284.         and    bl,0F0h
  285.         mov    word ptr [bx],1024
  286.         mov    [RS_buf_off],bx
  287.         mov    [RS_buf_seg],ds
  288.         mov    [RS_irq_off],offset RS_irq_ent
  289.         mov    [RS_irq_seg],cs
  290.  
  291.         mov    ah,03h
  292.         mov    al,[term_port]
  293.         mov    di,offset DGROUP:RS_param
  294.         int    9Bh
  295.  
  296.         mov    ah,01h
  297.         mov    al,[term_port]
  298.         int    9Bh
  299.  
  300.         ret
  301. RS_init        endp
  302.  
  303. RS_end        proc    near
  304.         mov    ah,02h
  305.         mov    al,es:[term_port]
  306.         int    9Bh
  307.  
  308.         push    ds
  309.         mov    ah,03h
  310.         mov    al,es:[term_port]
  311.         push    es
  312.         pop    ds
  313.         mov    di,offset DGROUP:RS_old_param
  314.         int    9Bh
  315.         pop    ds
  316.  
  317.         mov    dx,es:[RS_status]
  318.         cmp    dh,0
  319.         jne    RS_end_1
  320.  
  321.         mov    ah,01h
  322.         mov    al,es:[term_port]
  323.         int    9Bh
  324.  
  325.         mov    ah,08h
  326.         mov    dx,es:[RS_status]
  327.         int    9Bh
  328.  
  329. RS_end_1:    ret
  330.  
  331. RS_end        endp
  332.  
  333. Trap_Chk    proc    near
  334.         push    ax
  335.         push    cx
  336.         push    si
  337.         push    di
  338.  
  339.         mov    ax,3590h
  340.         int    21h
  341.  
  342.         cld
  343.         mov    cx,CHK_BYTE
  344.         mov    si,offset DGROUP:Chk_Str
  345.         mov    di,offset DGROUP:Chk_Str
  346.     repe    cmpsb
  347.         jne    Trap_Chk_No
  348.         clc
  349.         jmp    Trap_Chk_End
  350.  
  351. Trap_Chk_No:    push    ds
  352.         pop    es
  353.         stc
  354.  
  355. Trap_Chk_End:    pop    di
  356.         pop    si
  357.         pop    cx
  358.         pop    ax
  359.         ret
  360. Trap_Chk    endp
  361.  
  362. Get_Chr        proc    near
  363. Get_Chr_1:    lodsb
  364.         cmp    al,' '
  365.         je    Get_Chr_1
  366.         cmp    al,09h
  367.         je    Get_Chr_1
  368.         cmp    al,','
  369.         je    Get_Chr_1
  370.         cmp    al,'='
  371.         je    Get_Chr_1
  372.         ret
  373. Get_Chr        endp
  374.  
  375. main        proc    near
  376.         mov    ax,cs
  377.         mov    ds,ax
  378.         mov    es,ax
  379.         cld
  380.  
  381.         mov    si,offset DGROUP:CmdsLine
  382.         lodsb
  383.         cmp    al,0
  384.         je    Trap_init
  385.         call    Get_Chr
  386.         cmp    al,0Dh
  387.         je    Trap_init
  388.  
  389.         cmp    al,'-'
  390.         jne    Param_Error
  391.  
  392.         call    Trap_Chk
  393.         jnc    Trap_Clr
  394.  
  395.         mov    dx,offset DGROUP:Non_Msg
  396.         jmp    End_of_Msg
  397.  
  398. Param_Error:    mov    dx,offset DGROUP:Prm_Msg
  399.         jmp    End_of_Msg
  400.  
  401. Trap_Clr:    call    RS_end
  402.  
  403.         push    ds
  404.         lds    dx,es:[key_vect]
  405.         mov    ax,2590h        ; Set 21h int Vect
  406.         int    21h
  407.         pop    ds
  408.  
  409.         mov    ah,49h            ; free Now Trap Seg
  410.         int    21h
  411.  
  412.         mov    dx,offset DGROUP:Clr_Msg
  413. End_of_Msg:    mov    ah,9            ; Disp Msg
  414.         int    21h
  415.  
  416. End_of_Proc:    mov    ax,4C00h        ; End of
  417.         int    21h
  418.  
  419. Trap_init:    call    RS_init
  420.  
  421.         mov    ax,3590h        ; Get 21h Int Vect
  422.         int    21h
  423.         mov    word ptr cs:[key_vect],bx
  424.         mov    word ptr cs:[key_vect+2],es
  425.  
  426.         mov    dx,offset DGROUP:Key_Bios
  427.         mov    ax,2590h        ; Set New Vect
  428.         int    21h
  429.  
  430.         mov    es,[EnvSeg]
  431.         mov    ah,49h            ; Free ENV Seg
  432.         int    21h
  433.         mov    word ptr [EnvSeg],0    ; Clear Env Seg
  434.  
  435.         mov    dx,offset DGROUP:TSR_Msg
  436.         mov    ah,9            ; Disp Msg
  437.         int    21h
  438.  
  439.         mov    dx,offset DGROUP:Start_init
  440.         add    dx,15
  441.         shr    dx,4
  442.         mov    ax,3100h        ; TSR End of
  443.         int    21h
  444.  
  445. main        endp
  446.  
  447. Clr_Msg        db    'RSKEYの常駐を解除しました'
  448.         db    0Dh,0Ah,'$'
  449.  
  450. TSR_Msg        db    'RSKEYの常駐しました'
  451.         db    0Dh,0Ah
  452.         db    'PF11キ-のトグル動作でキ-ボ-ド<->RS232Cになります'
  453.         db    0Dh,0Ah,'$'
  454.  
  455. Non_Msg        db    'RSKEYが常駐されていません?'
  456.         db    0Dh,0Ah,'$'
  457.  
  458. Prm_Msg        db    'RSKEY - で常駐解除です'
  459.         db    0Dh,0Ah,'$'
  460.  
  461. _INST        ends
  462.         end    entry
  463.